package com.oplink.webems.modules.cfg.services;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.oplink.webems.common.persistence.Page;
import com.oplink.webems.modules.cfg.dao.CfgSiteDao;
import com.oplink.webems.modules.cfg.entity.CfgNe;
import com.oplink.webems.modules.cfg.entity.CfgSite;
import com.oplink.webems.modules.cfg.entity.CfgSlot;
import com.oplink.webems.modules.sys.dto.TreeDTO;

/**
 * 站点
 * 
 * @author yizhang
 */
@Component
@Transactional
public class CfgSiteService {

	@Autowired
	private CfgSiteDao siteDao;

	public List<CfgSite> getAllSite() {
		return (List<CfgSite>) siteDao.findAll();
	}

	public List<TreeDTO> getDTOList() {
		List<TreeDTO> listOut = new ArrayList<TreeDTO>();
		List<CfgSite> listSite = getAllSite();
		// 准备拓扑根节点
		TreeDTO topoDto = new TreeDTO();
		topoDto.setId("0.0");
		topoDto.setpIds("0");
		topoDto.setName("拓扑");
		topoDto.setType(TreeDTO.ICON_TOPO);
		listOut.add(topoDto);

		// 准备站点
		for (CfgSite site : listSite) {
			// site.getNelist()
			TreeDTO siteDto = new TreeDTO();
			siteDto.setId(site.getSid().toString());
			siteDto.setpId("0.0");
			siteDto.setpIds("0");
			siteDto.setName(site.getSname() + " 站点 ");
			siteDto.setType(TreeDTO.ICON_STATION);
			listOut.add(siteDto);
			List<CfgNe> listNe = site.getNelist();
			// 生成网元
			for (CfgNe ne : listNe) {
				TreeDTO neDto = new TreeDTO();
				neDto.setId(site.getSid() + "_" + ne.getNid());
				neDto.setpId(site.getSid().toString());
				neDto.setpIds(site.getSid() + "_" + ne.getNid());
				neDto.setName(ne.getNename() + " 网元 ");
				neDto.setType(TreeDTO.ICON_NE);
				// 生成端口
				listOut.add(neDto);
				List<CfgSlot> listSlot = ne.getSlotlist();
				for (CfgSlot slot : listSlot) {
					TreeDTO slotDto = new TreeDTO();
					slotDto.setId(site.getSid() + "_" + ne.getNid() + "_" + slot.getSlotid());
					slotDto.setPort("" + slot.getNum());
					slotDto.setpId(site.getSid() + "_" + ne.getNid());
					slotDto.setpIds(site.getSid() + "_" + ne.getNid() + "_" + slot.getSlotid());
					slotDto.setName(slot.getLabel() + " 槽位 ");
					slotDto.setType(TreeDTO.ICON_SLOT);
					slotDto.setEnable((slot.getCard() != null));
					listOut.add(slotDto);
				}
			}
		}
		return listOut;
	}

	public List<CfgNe> getNeBySite(String siteid) {
		CfgSite siteobj = siteDao.findOne(Long.parseLong(siteid));
		List<CfgNe> nelist = siteobj.getNelist();
		return nelist;
	}

	public Page<CfgSite> find(Page<CfgSite> page, CfgSite ne) {
		DetachedCriteria dc = siteDao.createDetachedCriteria();
		// 添加查询条件
		if (StringUtils.isNotEmpty(ne.getSname())) {
			dc.add(Restrictions.like("sname", "%" + ne.getSname() + "%"));
		}
		/* dc.add(Restrictions.eq(Index.DEL_FLAG, Index.DEL_FLAG_NORMAL)); */
		dc.addOrder(Order.desc("sid"));
		return siteDao.find(page, dc);
	}

	public CfgSite getEntity(Long id) {
		return siteDao.findOne(id);
	}

	public List<CfgSite> getSiteByName(String name) {
		return siteDao.getSiteByName(name);
	}

	/**
	 * 是否存在站点名称
	 * 
	 * @param name
	 * @return
	 */
	public boolean existSiteName(String name) {
		return (siteDao.getSiteByName(name).size() < 2);
	}

	public Long save(CfgSite entity) {
		return siteDao.save(entity).getSid();
	}

	public void delete(Long id) {
		siteDao.delete(id);
	}
}
